const { body } = require('express-validator');

exports.createCar = [
    body('brand')
        .notEmpty().withMessage('品牌不能为空').bail(),
    
    body('model')
        .notEmpty().withMessage('型号不能为空').bail(),
    
    body('level')
        .notEmpty().withMessage('车辆级别不能为空').bail()
        .isIn(['经济型', '舒适型', '豪华型', '商务型'])
        .withMessage('无效的车辆级别').bail(),
    
    body('type')
        .notEmpty().withMessage('车辆类型不能为空').bail()
        .isIn(['轿车', 'SUV', 'MPV', '跑车', '面包车'])
        .withMessage('无效的车辆类型').bail(),
    
    body('dailyRate')
        .notEmpty().withMessage('日租金不能为空').bail()
        .isNumeric().withMessage('日租金必须是数字').bail()
        .custom(value => value >= 0).withMessage('日租金不能小于0').bail(),
    
    body('city')
        .notEmpty().withMessage('取车城市不能为空').bail(),
    
    body('returnCities')
        .isArray().withMessage('还车城市必须是数组').bail()
        .notEmpty().withMessage('还车城市不能为空').bail()
        .custom(cities => {
            if (!cities.every(city => typeof city === 'string' && city.trim())) {
                throw new Error('还车城市格式不正确');
            }
            return true;
        }),
    
    body('location')
        .notEmpty().withMessage('具体地址不能为空').bail(),
    
    body('specifications.seats')
        .notEmpty().withMessage('座位数不能为空').bail()
        .isInt({ min: 1 }).withMessage('座位数必须是正整数').bail(),
    
    body('specifications.powerType')
        .notEmpty().withMessage('动力类型不能为空').bail()
        .isIn(['燃油', '纯电动', '混动'])
        .withMessage('无效的动力类型').bail(),
    
    body('specifications.length')
        .optional()
        .isNumeric().withMessage('长度必须是数字').bail(),
    
    body('specifications.width')
        .optional()
        .isNumeric().withMessage('宽度必须是数字').bail(),
    
    body('specifications.height')
        .optional()
        .isNumeric().withMessage('高度必须是数字').bail(),
    
    body('specifications.trunkCapacity')
        .optional()
        .isNumeric().withMessage('后备箱容积必须是数字').bail(),
    
    body('specifications.fuelConsumption')
        .optional()
        .isNumeric().withMessage('油耗必须是数字').bail(),
    
    body('additionalServices')
        .optional()
        .custom((value, { req }) => {
            try {
                if (!value) return true;
                
                // 如果是字符串，尝试解析
                let services;
                if (typeof value === 'string') {
                    // 清理字符串中的换行符等
                    const cleanValue = value.replace(/\r\n/g, '');
                    services = [JSON.parse(cleanValue)];
                } else {
                    services = Array.isArray(value) ? value : [value];
                }
                
                // 处理数组中的每个元素
                const processedServices = services.map(service => {
                    // 如果是字符串，尝试解析为对象
                    const serviceObj = typeof service === 'string' 
                        ? JSON.parse(service) 
                        : service;

                    // 验证对象格式
                    if (!serviceObj.name || !serviceObj.price || !serviceObj.description) {
                        throw new Error('附加服务必须包含 name、price 和 description');
                    }

                    // 返回处理后的对象，确保 price 是数字类型
                    return {
                        name: serviceObj.name,
                        price: Number(serviceObj.price),
                        description: serviceObj.description
                    };
                });

                // 将处理后的数据存储回请求对象
                req.body.additionalServices = processedServices;
                return true;
            } catch (error) {
                throw new Error('附加服务格式不正确: ' + error.message);
            }
        })
];

exports.updateCar = [
    body('brand')
        .optional()
        .notEmpty().withMessage('品牌不能为空').bail(),
    
    body('model')
        .optional()
        .notEmpty().withMessage('型号不能为空').bail(),
    
    body('level')
        .optional()
        .isIn(['经济型', '舒适型', '豪华型', '商务型'])
        .withMessage('无效的车辆级别').bail(),
    
    body('type')
        .optional()
        .isIn(['轿车', 'SUV', 'MPV', '跑车', '面包车'])
        .withMessage('无效的车辆类型').bail(),
    
    body('dailyRate')
        .optional()
        .isNumeric().withMessage('日租金必须是数字').bail()
        .custom(value => value >= 0).withMessage('日租金不能小于0').bail(),
    
    body('status')
        .optional()
        .isIn(['可租', '已租', '维修中'])
        .withMessage('无效的车辆状态').bail(),
    
    body('returnCities')
        .optional()
        .isArray().withMessage('还车城市必须是数组').bail()
        .custom(cities => {
            if (!cities.every(city => typeof city === 'string' && city.trim())) {
                throw new Error('还车城市格式不正确');
            }
            return true;
        }),
]; 